package com.aura.springbook.service;

import com.aura.springbook.model.Book;
import com.aura.springbook.model.BookCategory;
import com.aura.springbook.model.User;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * 管理员服务接口
 * <p>
 * 定义管理员相关的业务操作接口，包括：
 * 1. 图书分类管理（增删改查）
 * 2. 图书信息管理（增删改查、库存调整）
 * 3. 用户管理（查询用户、角色调整）
 * <p>
 * 所有方法都需要管理员权限才能调用
 */
public interface AdminService {

    /**
     * 创建图书分类
     * <p>
     * 管理员创建新的图书分类，分类名称不能重复
     *
     * @param category 图书分类信息
     * @return 是否创建成功
     */
    boolean createCategory(BookCategory category);

    /**
     * 更新图书分类
     * <p>
     * 管理员更新图书分类信息
     *
     * @param category 图书分类信息
     * @return 是否更新成功
     */
    boolean updateCategory(BookCategory category);

    /**
     * 删除图书分类
     * <p>
     * 管理员删除图书分类，只有当分类下没有图书时才能删除
     *
     * @param categoryId 分类ID
     * @return 是否删除成功
     */
    boolean deleteCategory(Long categoryId);

    /**
     * 获取所有图书分类
     * <p>
     * 管理员获取所有图书分类列表
     *
     * @return 图书分类列表
     */
    List<BookCategory> getAllCategories();

    /**
     * 创建图书
     * <p>
     * 管理员创建新的图书信息
     *
     * @param book 图书信息
     * @return 是否创建成功
     */
    boolean createBook(Book book);

    /**
     * 更新图书
     * <p>
     * 管理员更新图书信息
     *
     * @param book 图书信息
     * @return 是否更新成功
     */
    boolean updateBook(Book book);

    /**
     * 删除图书
     * <p>
     * 管理员删除图书，只有当图书没有未归还的借阅记录时才能删除
     *
     * @param bookId 图书ID
     * @return 是否删除成功
     */
    boolean deleteBook(Long bookId);

    /**
     * 更新图书库存
     * <p>
     * 管理员更新图书库存数量
     *
     * @param bookId 图书ID
     * @param stock  库存数量（不能为负数）
     * @return 是否更新成功
     */
    boolean updateBookStock(Long bookId, int stock);

    /**
     * 获取所有用户
     * <p>
     * 管理员获取所有用户列表
     *
     * @return 用户列表
     */
    List<User> getAllUsers();

    /**
     * 更新用户角色
     * <p>
     * 管理员更新用户角色（普通用户/管理员）
     *
     * @param userId 用户ID
     * @param role   角色（USER/ADMIN）
     * @return 是否更新成功
     */
    boolean updateUserRole(Long userId, String role);
}